package com.hdax.search.thread;


import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ChuanHangHua {

    /**
     * 上一个线程执行完毕，在执下一个线程
     */
    /**
     * 线程串行化:
     *  1、thenRunAsync他是不能获取到上一步的执行结果的,无返回值
     *  2、thenAcceptAsync：他可以获取到上一步的返回结果，无返回值
     *  3、thenApplyAsync:既可以获取到上一步的返回结果，又可以有返回值
     */

    public static ExecutorService executorService=Executors.newFixedThreadPool(10);
    public static void main(String[] args) {
        /**
         *  1、thenRunAsync他是不能获取到上一步的执行结果的,无返回值
         */
//        CompletableFuture.supplyAsync(()->{
//            System.out.println("当前线程"+Thread.currentThread().getId());
//            int i = 10 / 4;
//            System.out.println("运行结果"+i);
//            return i;
//        },executorService).thenRunAsync(()->{
//            System.out.println("线程2启动了");
//        },executorService);

        /**
         * 2、thenAcceptAsync：他可以获取到上一步的返回结果，无返回值
         */
//        CompletableFuture<Void> voidCompletableFuture = CompletableFuture.supplyAsync(() -> {
//            System.out.println("当前线程" + Thread.currentThread().getId());
//            int i = 10 / 4;
//            System.out.println("运行结果" + i);
//            return i;
//        }, executorService).thenAcceptAsync(res -> {
//            System.out.println("上一步的运行结果"+res);
//        }, executorService);

        /**
         * 3、thenApplyAsync:既可以获取到上一步的返回结果，又可以有返回值
         */

        CompletableFuture<Void> voidCompletableFuture = CompletableFuture.supplyAsync(() -> {
            System.out.println("当前线程" + Thread.currentThread().getId());
            int i = 10 / 4;
            System.out.println("运行结果" + i);
            return i;
        }, executorService).thenApplyAsync(res -> {
            System.out.println("上一步的运行结果"+res);
            return null;
        }, executorService);
    }
}
